#include<iostream>
#include "Fractie.h"

int Fractie::cmmdc(int a, int b){
	if(a == 0) return b;
	while(b != 0){
		if(a > b) a -= b;
		else b -= a;
	}	
	return a;
}

Fractie::Fractie(int numarator, int numitor)
  {
    this->numarator = numarator;
    this->numitor = numitor;
  }
  
Fractie::Fractie(Fractie& a)
  {
    this->numarator = a.numarator;
    this->numitor = a.numitor;
  }

Fractie Fractie::operator+(Fractie& a)
  {
    this->numarator = this->numarator * a.numitor + this->numitor * a.numarator;
    this->numitor = this->numitor * a.numitor;
    return (*this);
  }

Fractie Fractie::operator-()
  {
    this->numarator = - this->numarator;
    return (*this);
  }

Fractie Fractie::operator-(Fractie& a)
  {
    Fractie b;
    b = -a;
    this->numarator = this->numarator * b.numitor + this->numitor * b.numarator;
    this->numitor = this->numitor * b.numitor;
    return (*this);
  }

Fractie Fractie::operator*(Fractie& a)
  {
    this->numarator = this->numarator * a.numarator;
    this->numitor = this->numitor * a.numitor;
    this->simplifica();
    return (*this);
  }

Fractie Fractie::operator~()
  {
    int aux;
    aux = this->numarator;
    this->numarator = this->numitor;
    this->numitor = aux;
    return (*this);
  }//invers

Fractie Fractie::operator/(Fractie& a)
  {
    Fractie b;
    b = ~a;
    this->numarator = this->numarator * b.numarator;
    this->numitor = this->numitor * b.numitor;
    return (*this);
  }

void Fractie::simplifica()
  {
    int gcd;
    gcd = cmmdc(this->numarator, this->numitor);
    this->numarator /= gcd;
    this->numitor /= gcd;
  }//simplificare

std::istream& operator>>(std::istream& in, Fractie& a)
  {
    std::cout<<"\nCitire fractie:";
    std::cout<<"\nnumarator:";
    in>>a.numarator;
    std::cout<<"numitor:";
    in>>a.numitor;
    return in;
  }

std::ostream& operator<<(std::ostream& out, Fractie a)
  {
    out<<"Fractie:";
    out<<a.numarator<<"/"<<a.numitor<<" \n";
    return out;
  }
bool Fractie::operator<(Fractie& a)
  {
    if(this->val() < a.val()) return true;
    else return false;
  }

bool Fractie::operator>(Fractie& a)
  {
    if(this->val() > a.val()) return true;
    else return false;
  }

double Fractie::val()
  {
    return (1.0 * this->numarator) / this->numitor;
  }
